#include "stdlib.h"
#include "assert.h"
#include "err.h"
#include "colap.h"

/* Estructura del TAD */
struct scolap{
	heap cola; 	
};

/* Constructor del TAD */
colap colap_create(const size_t max){
	colap c;
	assert(max > 0);
	c = (colap)calloc(1,sizeof(struct scolap));
	if (c != NULL){
		c->cola = create_heap(max);
        }
        else errx(EXIT_FAILURE,"No hay memoria disponible");
	return c;
}

/* Encolar un elemento */
void colap_encolar(colap c, const tcpalpha elem){ 
	assert(c != NULL);
	assert(!colap_llena(c));
	add_heap(c->cola,elem);
}

/* Primero en la cola */
tcpalpha colap_primero(const colap c){
	tcpalpha elem;
	assert(c != NULL);
	assert(!colap_vacia(c));
	elem = top_heap(c->cola);
	return elem;
}

/* Saca primero */
void colap_pop(colap c){
	assert(c != NULL);
	assert(!colap_vacia(c));	
	heap_pop(c->cola);
}

/* Determina si la cola se encuentra vacía */
Bool colap_vacia(const colap c){
	assert(c != NULL);
	return (heap_vacio(c->cola));
}

/* Determina si la cola se encuentra llena */
Bool colap_llena(const colap c){
	assert(c != NULL);
	return (heap_lleno(c->cola));
}

/* Saca y obtiene cualquier elemento */
tcpalpha colap_saca(colap c){
	tcpalpha ar;
	assert(c != NULL);
	assert(!colap_vacia(c));
	ar = heap_saca(c->cola);
	return ar;
}

/* Destructor del TAD */
colap colap_destroy(colap c){
	assert(c != NULL);
	heap_destroy(c->cola);
	free(c);
        c = NULL;
	return c;
}
